socketjava断开连接
我制作了这个程序,但我遇到了一个问题。当客户端断开连接时,服务器崩溃,我不知道如何解决这个问题
import java.io.*;
import java.net.*;
public class clientread extends Thread{
Socket sc;
public int ver=0;
public clientread(Socket sc)
{
this.sc=sc;
}
public void run()
{ BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
while(true){
try{
String mes=buf.readLine();
if(mes.equals("END"))
{
sc.close();
break;
}
if(mes!=null)
{
PrintStream ps=new PrintStream(sc.getOutputStream());
ps.println(mes);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
import java.net.*;
import java.io.*;
public class citireserver extends Thread{
Socket sock;
public citireserver(Socket sr)
{
sock=sr;
}
public void run()
{
while(true)
{
try{
BufferedReader buf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
String mes=buf.readLine();
if(mes!=null)
System.out.println(mes);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
第一个从键盘读取消息并将其传输到服务器,服务器将其传输到其他客户端,第二个读取从服务器传输的所有内容并打印。我想在第一类中设置一个条件,如果客户机输入“END”,它将终止,但a不知道如何结束所有这些。 这是访问这两个类的客户机类
import java.net.*;
public class client {
public static void disc(Socket sc)
{
try{
sc.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args) {
try{
Socket sr=new Socket("192.168.0.105",1028);
new clientread(sr).start();
new citireserver(sr).start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.net.*;
public class server {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("the server is running");
try{
ServerSocket sr=new ServerSocket(1028,100);
while(true)
{
new handler(sr.accept()).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.io.*;
import java.util.*;
import java.net.*;
public class handler extends Thread {
public static ArrayList<Socket> sock=new ArrayList<Socket>();
Socket sc;
public handler(Socket sc)
{
this.sc=sc;
}
public void check()
{
if(!sc.isConnected())
{
for(int i=0;i<sock.size();i++)
if(sock.get(i)==sc)
sock.remove(i);
}
}
public void run()
{
sock.add(sc);
System.out.println("connected");
while(true)
{
try{
BufferedReader io=new BufferedReader(new InputStreamReader(sc.getInputStream()));
String ms=io.readLine();
System.out.println(ms);
if(ms.equals("END"))
{
break;
}
if(ms!=null)
{
Iterator<Socket> it=sock.iterator();
while(it.hasNext())
{
Socket vv=it.next();
PrintStream ps=new PrintStream (vv.getOutputStream());
ps.println(ms);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
try{
sc.close();
check();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
我想把if放在buf之后的头等舱。读线,如果条件为真,则sc.关闭并断开。但它什么也没做,我收到一条消息,可能是因为这个socket在第二个类的另一个线程中使用,我不知道如何停止所有这些。我在我关闭的客户端中遇到了这个错误
java.net.SocketException: Socket is closed at java.net.Socket.getInputStream(Socket.java:876) at citireserver.run(citireserver.java:15)
编辑:在我解决了这个问题后,我得到了另一个
error:java.net.SocketException: Socket is closed at java.net.Socket.getOutputStream(Socket.java:916) at handler.run(handler.java:41)
这个错误出现在我断开一个客户机的连接之后,我认为这是因为该socket没有从arraylist中删除,当它迭代时,它会在该socket上运行。为什么它不移除它?check()有什么问题
# 1 楼答案
当
readLine()
返回null时,您应该: